
#pragma region CLASS_DESCRIPTION
/*
* =========================================================================================

* AUTHOR:      Physics Core Team (Ron Ram, Matt Hoyes, Randy Prieto, Kris Greene)
* DATE:        01/17/2012
*
* CLASS:       Box3D Primitive Shape (Box3D.h)
*
* DESCRIPTION:
* ---------------------------------------------------------------------------------------
*	This is a primitive 3D box shape
*	All 3D shapes must implement all properties and behaviours described in 
*	Shape3D abstract class
* =========================================================================================
*/
#pragma endregion


#ifndef BOX3D_H_
#define BOX3D_H_


#include "Shape3D.h"


namespace Physics
{
	//Forward declaration
	class Circle3D;

	class Box3D : public Shape3D
	{
	private:
		//DATA MEMBERS...
		float length, width, height;
		static int bx3D_InstanceCount; //count instance objects
		

	public:
		//---------------- CONSTRUCTORS ----------------
		Box3D();																																		//C001: Default Constructor
		Box3D(const float length, const float width, const float height, const Vector3 &pos);															//C002: Overloaded Constructor
		Box3D(const float length, const float width, const float height, const Vector3 &pos, const Vector3 &dir);										//C003: Overloaded Constructor
		Box3D(const float length, const float width, const float height, const Vector3 &pos, const Vector3 &dir, const float speed, const float mass);	//C004: Overloaded Constructor

		Box3D( const Box3D &box );																													//C005: COPY Constructor
		Box3D& operator=( const Box3D &box );																											//C006: Assignment Operator
		virtual ~Box3D();																																//C007: Virtual Destructor

		//---------------- PROPERTIES ----------------
		void setLength(const float length);										//M001: Setter Length
		const float getLength() const;											//M002: Getter Length

		void setWidth(const float width);										//M003: Setter Width
		const float getWidth() const;											//M004: Getter Width
		
		void setHeight(const float height);										//M005: Setter Height
		const float getHeight() const;											//M006: Getter Height

		static const int count();												//M026: Getter Instance Count
		
		/***************************************************************
		-------------------------- IMPORTANT -------------------------- 
		***************************************************************
		In C++ pure abstract have to be re-defined in derived class,
		Opposite to C# style of coding
		****************************************************************/


#pragma region IPhysicsObject_Re-DEFINE_METHODs_AGAIN
		//
		void Info();															//M027: Print Summary Info about instance object
#pragma endregion


#pragma region ICollision3D_Re-DEFINE_METHODS_AGAIN
		//
		bool collision(const Box3D &box);										//M007: THIS -> Box3D collision check
		bool collision(const Circle3D &circle);									//M008: THIS -> Circle3D collision check
#pragma endregion


#pragma region Shape3D_Re-DEFINE_METHODS_AGAIN
		//CENTER_LOCATION
		const Vector3 getCenter() const;										//M009: Getter Center

		//ROTATION_3D
		//Applied to XYZ Directions
		void rotateInDegs(const Vector3 &degrees);								//M010: Rotation input Vector3 in DEGREES
		void rotateInDegs(const float degrees);									//M011: Rotation input float in DEGREES
		void rotateInDegs(const float X, const float Y, const float Z);			//M012: Rotation input floats in DEGREES

		//Applied to XYZ Directions
		void rotateInRads(const Vector3 &radians);								//M013: Rotation input Vector3 in RADIANS
		void rotateInRads(const float radians);									//M014: Rotation input float in RADIANS
		void rotateInRads(const float X, const float Y, const float Z);			//M015: Rotation input floats in RADIANS

		//Applied to X-Direction
		void rotateX_InDegs(const float degrees);								//M016: Rotation input float in DEGREES
		void rotateX_InRads(const float radians);								//M017: Rotation input float in RADIANS
		
		//Applied to Y-Direction
		void rotateY_InDegs(const float degrees);								//M018: Rotation input float in DEGREES
		void rotateY_InRads(const float radians);								//M019: Rotation input float in RADIANS

		//Applied to Z-Direction
		void rotateZ_InDegs(const float degrees);								//M020: Rotation input float in DEGREES
		void rotateZ_InRads(const float radians);								//M021: Rotation input float in RADIANS


		//TRANSLATION_POSITION
		void translatePosition(const float X, const float Y, const float Z);	//M022: Translate Position using float
		void translatePosition(const Vector3 &value);							//M023: Translate Position using Vector3

		//TRANSLATION_DIRECTION
		void translateDirection(const float X, const float Y, const float Z);	//M024: Translate Direction using floats
		void translateDirection(const Vector3 &value);							//M025: Translate Direction using Vector3
#pragma endregion
	
	};
} /* NAMESPACE */

#endif